# -*- coding: utf-8 -*-
import cv2
import subprocess
import time
import argparse


def main(rtsp_url):
    # 设置 RTSP 服务器地址
    rtsp_server = rtsp_url

    # 定义 ffmpeg 命令，用于推流
    ffmpeg_command = [
        'ffmpeg',
        '-re',
        '-f', 'rawvideo',
        '-pixel_format', 'bgr24',  # 摄像头读取的数据格式
        '-video_size', '640x480',
        '-framerate', '10',
        '-i', '-',  # 从标准输入读取视频数据
        '-c:v', 'libx264',
        '-f', 'rtsp',
        '-bufsize','10000k',
        '-rtsp_transport', 'tcp',
        '-g','3',
        '-fec','g=1:l=1',
        rtsp_server
    ]
    # 打开摄像头（这里使用默认摄像头，如需指定其他设备可以使用设备路径，例如"/dev/video0"）
    cap = cv2.VideoCapture("/dev/front_camera")
    if not cap.isOpened():
        print("无法打开摄像头")
        return

    # 启动 ffmpeg 进程，准备推流
    process = subprocess.Popen(ffmpeg_command, stdin=subprocess.PIPE)

    try:
        while True:
            ret, frame = cap.read()
            if not ret:
                print("无法读取视频帧")
                break

            # 将视频帧数据写入 ffmpeg 的标准输入
            process.stdin.write(frame.tobytes())

            # 控制帧率（这里设置为 30fps）
            time.sleep(1/30)
    except KeyboardInterrupt:
        print("推流结束")
    finally:
        cap.release()
        process.stdin.close()
        process.wait()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description="RTSP 推流程序")
    parser.add_argument("--ip", type=str, required=True, help="RTSP 地址中的 IP，如 194.194.194.3")
    parser.add_argument("--uav", type=int, required=True, help="RTSP 地址中的 UAV 编号")
    args = parser.parse_args()
    rtsp_url = f"rtsp://{args.ip}:8554/uav{args.uav}"
    print(f"RTSP 地址为：{rtsp_url}")

    # 调用主逻辑
    main(rtsp_url)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
